package com.sap.sap_mangers.mapper;

import com.sap.sap_mangers.Vo.MessageBoardVo.MessageBoardArticleVo;
import com.sap.sap_mangers.Vo.MessageBoardVo.MessageBoardCommentVo;
import com.sap.sap_mangers.Vo.MessageBoardVo.MessageBoardNewsVo;
import com.sap.sap_mangers.dto.message_board.*;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * @author 谢添
 * 2022/8/19 16:19
 */
@Mapper
public interface MessageBoardMapper {
    /**
     * 创建一篇留言板文章
     *
     * @param article 文章信息
     */
    void createArticle(@Param("article") MessageBoardArticle article);

    /**
     * 通过文章id获取到 article 表的信息，同时给出作者的真名与头像
     *
     * @param id 文章id
     * @return 表信息
     */
    MessageBoardArticleVo getArticleTableMessageById(@Param("id") Integer id);

    /**
     * 通过文章id获取到 对该文章的 简单点赞用户信息
     *
     * @param articleId 文章id
     * @return 简单用户信息
     */
    List<MessageBoardSimplePraiseUser> getSimplePraiseUsersByArticleId(@Param("articleId") Integer articleId);

    /**
     * 通过文章id获取到 对该文章的 评论
     *
     * @param articleId 文章id
     * @return 评论
     */
    List<MessageBoardCommentVo> getMessageBoardCommentVosByArticleId(@Param("articleId") Integer articleId);

    /**
     * 修改文章
     *
     * @param article 修改信息
     */
    void updateArticle(@Param("article") MessageBoardArticle article);

    /**
     * 创建一条评论
     *
     * @param messageBoardCommentVo 评论信息：userId,articleId,content
     */
    void createComment(@Param("messageBoardCommentVo") MessageBoardCommentVo messageBoardCommentVo);

    /**
     * 创建一条新消息
     *
     * @param messageBoardPraiseAndCommentNews 消息信息
     */
    void createPraiseOrCommentNews(@Param("messageBoardPraiseAndCommentNews") MessageBoardPraiseAndCommentNews messageBoardPraiseAndCommentNews);

    /**
     * 查询文章是否存在，返回文章的数量
     *
     * @param articleId 文章id
     * @return 文章数量
     */
    Long existArticle(@Param("articleId") Integer articleId);

    /**
     * 根据newsId修改消息表的文章id
     *
     * @param commentOrPraiseId 评论或点赞的id
     */
    void updatePraiseAndCommentNewsForCommentOrPraiseIdByNewsId(@Param("commentOrPraiseId") Integer commentOrPraiseId, @Param("newsId") Integer newsId);

    /**
     * 添加文章表的评论数
     *
     * @param articleId 文章id
     */
    void updateCommentLenForAddAtArticleTable(@Param("articleId") Integer articleId);

    /**
     * 通过commentId直接删除评论
     *
     * @param commentId 评论的id
     */
    void delCommentByCommentId(@Param("commentId") Integer commentId);

    /**
     * 通过commentOrPraiseId删除消息
     *
     * @param commentOrPraiseId 评论或点赞的id
     */
    void delNewsByCommentOrPraiseId(@Param("commentOrPraiseId") Integer commentOrPraiseId);

    /**
     * 通过文章id减少评论次数：-1
     *
     * @param articleId 文章id
     */
    void reduceCommentLenForArticleTableByArticleId(@Param("articleId") Integer articleId);

    /**
     * 通过 文章id ，评论发表人的id ， 评论的id 证明该条评论确实存在
     *
     * @param commentVo articleId,commentId,userId
     * @return 查询情况
     */
    Long existCommentByCommentIdAndArticleIdAndUserId(@Param("commentVo") MessageBoardCommentVo commentVo);

    /**
     * 通过用户id获取该用户的全部的文章
     *
     * @param userId 用户id
     * @return 该用户全部文章
     */
    List<MessageBoardArticleVo> getUserAllArticleByUserId(@Param("userId") Integer userId);

    /**
     * 通过 文章id 和 用户id 确认文章存在
     *
     * @param articleId 文章Id
     * @param userId    用户Id
     * @return 查询情况
     */
    Long existArticleByArticleIdAndUserId(@Param("articleId") Integer articleId, @Param("userId") Integer userId);

    /**
     * 通过 article_id 删除某篇文章 --> 操作article表
     *
     * @param articleId 文章id
     */
    void delArticleByArticleId(@Param("articleId") Integer articleId);

    /**
     * 通过 article_id 删除某篇文章的全部点赞 --> 操作praise表
     *
     * @param articleId 文章id
     */
    void delPraiseByArticleId(@Param("articleId") Integer articleId);

    /**
     * 通过 article_id 删除某篇文章的全部评论 --> 操作comment表
     *
     * @param articleId 文章id
     */
    void delCommentByArticleId(@Param("articleId") Integer articleId);

    /**
     * 通过 article_id 删除某篇文章的全部消息 --> 操作news表
     *
     * @param articleId 文章id
     */
    void delNewsByArticleId(@Param("articleId") Integer articleId);

    /**
     * 创建一个点赞
     *
     * @param praise 点赞信息
     */
    void createPraise(@Param("praise") MessageBoardPraise praise);

    /**
     * 增加点赞次数：+1
     *
     * @param articleId 点赞的文章id
     */
    void updatePraiseLenForAddAtArticleTable(@Param("articleId") Integer articleId);

    /**
     * 减少点赞次数：-1
     *
     * @param articleId 文章id
     */
    void reducePraiseLenForArticleTableByArticleId(@Param("articleId") Integer articleId);

    /**
     * 取消 / 生成 点赞：将praise表的status 修改
     *
     * @param articleId 文章id
     * @param status    取消或生成点赞:0/1
     * @param userId    用户id
     */
    void updatePraiseStatusForPraiseTable(@Param("articleId") Integer articleId, @Param("status") Integer status, @Param("userId") Integer userId);

    /**
     * 得到点赞的状态，如果从未点过赞，则返回null
     *
     * @param articleId 文章id
     * @param userId    用户id
     * @return 状态，从未点赞返回null
     */
    Integer getPraiseStatusOfPraiseTable(@Param("articleId") Integer articleId, @Param("userId") Integer userId);

    /**
     * 查看该用户未查看的新文章的数量
     *
     * @param userId 用户id
     * @return 新文章数量
     */
    Integer getNewNoViewArticleCounts(@Param("userId") Integer userId);


    /**
     * 修改用户最后一次访问留言板的时间为当前时间
     *
     * @param userId 用户id
     */
    void updateViewBoardLastTime(@Param("userId") Integer userId);

    /**
     * 修改用户最后一次访问留言板消息栏的时间为当前时间
     *
     * @param userId 用户id
     */
    void updateViewNewsLastTime(@Param("userId") Integer userId);

    /**
     * 在按照时间排序的文章列表中获取到小于articleId的共limitNumber个数据
     *
     * @param articleId   文章id
     * @param limitNumber 限制数量
     * @return 数据
     */
    List<MessageBoardArticleVo> getArticlesForLimitNumberByArticleId(@Param("articleId") Integer articleId, @Param("limitNumber") Integer limitNumber);

    /**
     * 按 userId 查找最后时间
     *
     * @param userId 用户id
     * @return 返回时间
     */
    MessageBoardUserView getLastTimeViewBoardAndNews(@Param("userId") Integer userId);

    /**
     * 获取对于该userId的留言板消息栏的新消息的数量，新消息的概念等价于微信朋友圈（无是否为好友的区分）
     *
     * @param userId 用户id
     * @return 新消息数量
     */
    Integer getNoViewNewsNumberForUser(@Param("userId") Integer userId);


    /**
     * 获取留言板消息栏消息（已按时间排序）
     *
     * @param userId      用户id
     * @param limitNumber 限制返回的最多消息数量
     * @param newsId      返回比该id小的消息
     * @return 消息
     */
    List<MessageBoardNewsVo> getNewsForLimitNumber(@Param("userId") Integer userId, @Param("limitNumber") Integer limitNumber, @Param("newsId") Integer newsId);

    /**
     * 该文章的点击数：+1
     *
     * @param articleId 文章id
     */
    void updateHitLenForAddAtArticleTable(@Param("articleId") Integer articleId);

    List<String> getUsernameBeforeThisUserToNewNotice(@Param("date") Date date, @Param("articleId") Integer articleId, @Param("userId") String userId);

    MessageBoardArticle getArticleMessageByArticleId(@Param("articleId") Integer articleId);

    /**
     * 通过 id 返回点赞信息
     *
     * @param praiseId 点赞id
     * @return 点赞信息
     */
    MessageBoardPraise getPraiseMessageByPraiseId(@Param("praiseId") Integer praiseId);

    /**
     * 通过 id 返回评论信息
     *
     * @param commentId 评论id
     * @return 信息
     */
    MessageBoardCommentVo getCommentMessageByCommentId(@Param("commentId") Integer commentId);
}
